<?php

if(!defined("VL_LEGAL")) die();

/**
 * Основной класс системы, интерфейс доступа к ее функциям
 * @author vladimmi <vladimmi@ya.ru>
 */


/**
 * Главный класс CMS.
 * Загружает все остальные классы и предоставляет
 * доступ к ним из любого места кода
 * @author vladimmi <vladimmi@ya.ru>
 */
class vlAPI
{
	/**
	 * Подключенные базы данных
	 * @var vlDatabase
	 */
	var $db=array();
	
	/**
	 * Вывод сообщений об отладке
	 * @var FirePHP
	 */
	var $debug=null;
	
	/**
	 * Управление событиями
	 * @var vlEvents 
	 */
	var $events=null;
	
	/**
	 * Параметры конфигурации
	 * @var mixed
	 */
	private $config;
	
	/**
	 * Управление правами
	 * @var vlPermissions
	 */
	var $permissions;
	
	/**
	 * Разобранная строка запроса
	 * @var mixed
	 */
	private $request;
	
	/**
	 * Информация о текущем пользователе
	 * @var vlUser 
	 */
	var $user;
	
	
	/**
	 * Синглтон
	 */
	function &getInstance()
	{
		static $_instance;
		if(!is_object($_instance)) $_instance=new vlAPI();
		return $_instance;
	}
	
	/**
	 * Конструктор
	 */
	function vlAPI()
	{
		//Подключение файлов ядра
		require_once(VL_DIR_CLASSES."FirePHP.class.php");
		require_once(VL_DIR_CLASSES."vlDatabase.class.php");
		require_once(VL_DIR_CLASSES."vlEvent.class.php");
		require_once(VL_DIR_CLASSES."vlEvents.class.php");
		require_once(VL_DIR_CLASSES."vlPermissions.class.php");
		require_once(VL_DIR_CLASSES."vlPlugins.class.php");
		require_once(VL_DIR_CLASSES."vlUser.class.php");
		require_once(VL_DIR_CLASSES."vlUserGroup.class.php");
		
		//Инициализация
		$this->debug=new FirePHP();
		$this->events=new vlEvents();
		$this->permissions=new vlPermissions();
		$this->user=new vlUser();
	}
	
	/**
	 * Загрузка конфигурации
	 * @param string $config_file Путь к файлу конфигурации
	 * @return void
	 */
	function loadConfig($config_file)
	{
		include($config_file);
		$this->debug->setEnabled($this->config["debug"]);
		$this->debug->group("Загрузка конфигурации");
		for($i=0; $i<count($this->config['db']); $i++) {
			$this->debug->group("База данных #".$i);
			$this->debug->assocTable("Параметры", $this->config['db'][$i]);
			$db=new vlDatabase($this->config['db'][$i]);
			if($db->connect()) {
				$this->debug->log("Успешно подключено");
				foreach($this->config['db'][$i]['roles'] as $role)
					$this->db[$role]=&$db;
			} else $this->debug->warn("Ошибка при подключении");
			$this->debug->groupEnd();
		}
		$this->debug->groupEnd();
		
		//Начальная идентификация пользователя
		$this->debug->group("Инициализация пользователя");
		$c=array(
			"_POST[vllogout]"=>$_POST["vllogout"],
			"_POST[vllogin]"=>$_POST["vllogin"],
			"_POST[vlpass]"=>$_POST["vlpass"],
			"_COOKIE[vllogin]"=>$_COOKIE["vllogin"],
			"_COOKIE[vlpass]"=>$_COOKIE["vlpass"]
		);
		$this->debug->assocTable("Данные авторизации", $c);
		if($_POST["vllogout"]==1) {
			$this->debug->log("Выходим");
			setcookie("vllogin", "", time()-360000);
			setcookie("vlpass", "", time()-360000);
		} else {
			if(isset($_POST["vllogin"]) && isset($_POST["vlpass"])) {
				$this->debug->log("Входим с данными из POST");
				if($this->user->login($_POST["vllogin"], $_POST["vlpass"])) {
					setcookie("vllogin", $_POST["vllogin"], time()+360000);
					setcookie("vlpass", $_POST["vlpass"], time()+360000);
				}
			} elseif(isset($_COOKIE["vllogin"]) && isset($_COOKIE["vlpass"])) {
				$this->debug->log("Входим с данными из COOKIE");
				if($this->user->login($_COOKIE["vllogin"], $_COOKIE["vlpass"])) {
					setcookie("vllogin", $_COOKIE["vllogin"], time()+360000);
					setcookie("vlpass", $_COOKIE["vlpass"], time()+360000);
				}
			}
		}
		$this->debug->groupEnd();
	}
	
	/**
	 * Подключения различных дополнительных возможностей VLCMS
	 * @param int $mode Тип подключамого расширения
	 * @param mixed $info Дополнительные параметры (зависят от типа)
	 * @return mixed Результат подключения, определяется в зависимости от типа расширения
	 */
	function using($mode, $info="")
	{
		switch($mode) {
			
			default:
		}
	}
	
	/**
	 * Вывод сообщения об ошибке
	 * @param string $title Заголовок сообщения
	 * @param string $text Текст ошибки
	 * @return void
	 */
	function error($title, $text)
	{
		die($text);
	}
	
	/**
	 * Вызов и обработка компонента
	 * @param string $name Имя компонента
	 * @param string $style Стиль оформления
	 * @param array $properties Параметры вызова
	 * @return mixed Результат обработки
	 */
	function component($name, $style="", $properties=array())
	{
		$this->debug->group("Вызов компонента");
		$this->debug->dump("Имя", $name);
		$this->debug->dump("Шаблон", $style);
		$this->debug->assocTable("Параметры", $properties);
		if(trim($name)=="") return false;
		$file=VL_DIR_COMPONENTS.$name."/index.php";
		$info=VL_DIR_COMPONENTS.$name."/info.php";
		if(!file_exists($info) || !file_exists($file)) return false;
		$info=include($info);
		include($file);
		$cmp=new $info["class"];
		$result=$cmp->run($style, $properties);
		$this->debug->groupEnd();
		return $result;
	}
	
	/**
	 * Обработка указанного события
	 * @param string $name Имя события
	 * @param mixed $properties Параметры события
	 * @return bool Зарегистрировано ли такое событие
	 */
	function event($name, &$properties)
	{
		$e=new vlEvent($name);
		$e->handle($properties);
	}
	
	/**
	 * Вывод страницы авторизации
	 * @return void
	 */
	function loginPage()
	{
		include(VL_DIR_MANAGER_THEMES."smoothness/login.tpl.php");
	}
	
	/**
	 * Разбор строки запроса и определение запрошенной страницы
	 * @param string $request Строка запроса
	 * @return void
	 */
	function parseRequest($request)
	{
		$tmp=$request;
		if(substr($tmp, 0, 4)=="www.") $tmp=substr($tmp, 4, strlen($tmp)-4);	//Очищаем от www. в начале
		$tmp=explode("/", $request);
	}
}

?>